<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

</body>
<script>
    /* 作用域提升复习 */

    /*1、 var 定义的变量,是全局变量，可以作用域提升，但是在函数体内用var定义的变量，作用域在函数内部，只在函数内部作用域提升
      2、 在 ECMAScript 6 中，let 和 const 同样会被提升变量到代码块的顶部但是不会被赋予初始值。在变量声明之前引用这个变量，
          将抛出引用错误（ReferenceError）。这个变量将从代码块一开始的时候就处在一个“暂时性死区”，直到这个变量被声明为止。 
      3、对于函数来说，只用函数声明会作用域提升，函数表达式不会作用域提升
      ================================================================================================================
      4、对象的key值是字符串，对于数字类key或者非法字符不能用点的形式表达，需要用中括号的形式，比如 obj[2],obj["!"],obj['']
    
    
    */

    // console.log("~~constzhi~~", v); // 报错阻断暂时性死区 ReferenceError: Cannot access 'v' before initialization
    // const v = 12


    var myvar = "local value";
    (function () {
        console.log(myvar); // undefined
        var myvar = "local s";
    })();
    console.log("2", myvar); // local value

    // window上挂载全局变量
    window.aa = function () {
        console.log("aa");
    }
    aa();

    // 对象字面量
    const obj = {
        // __proto__
        // __proto__: theProtoObj,
        // Shorthand for ‘handler: handler’
        aa,
        // Methods
        toString () {
            // Super calls
            console.log("super", super.toString());
            return "d " + super.toString();
        },
        ["prop_" + (() => 42)()]: 42,  // 计算属性名,需要中括号括起来
        2:"two",
    };
    console.log(Object.keys(obj), obj.toString());
</script>

</html>